#!/bin/bash

# 创建指定大小文件的脚本，支持多种填充内容
# 用法: ./create_files.sh [内容类型] [文件大小] [文件前缀] [自定义字符串]
# 内容类型: zero|random|text|char 默认为zero
# 文件大小: 如1G、500M、100K等，默认为1G
# 文件前缀: 生成文件的前缀，默认为"file"
# 自定义字符串: 用于text或char类型的填充内容，默认为"A"（char）或固定文本（text）

# 设置默认值
CONTENT_TYPE="${1:-zero}"
SIZE="${2:-1G}"
FILE_PREFIX="${3:-file}"
CUSTOM_STRING="${4:-}"

# 根据类型设置默认字符串
if [ -z "$CUSTOM_STRING" ]; then
    case $CONTENT_TYPE in
        "char") CUSTOM_STRING="A" ;;
        "text") CUSTOM_STRING="This is a fixed text line used to fill the file. " ;;
    esac
fi

FILE_COUNT="${5:-1}"

echo "开始创建 $FILE_COUNT 个 $SIZE 大小的文件..."
echo "内容类型: $CONTENT_TYPE"
echo "文件前缀: $FILE_PREFIX"
echo "自定义字符串: $CUSTOM_STRING"

# 大小转换函数（将1G、500M等转换为字节数）
convert_to_bytes() {
    local size_str=$(echo "$1" | tr 'a-z' 'A-Z')
    if [[ $size_str =~ ^([0-9]+)([KMG]?)$ ]]; then
        local num=${BASH_REMATCH[1]}
        local unit=${BASH_REMATCH[2]}
        case $unit in
            K) echo $((num * 1024)) ;;
            M) echo $((num * 1024 * 1024)) ;;
            G) echo $((num * 1024 * 1024 * 1024)) ;;
            *) echo $num ;;
        esac
    else
        echo "错误: 无效的大小格式: $1" >&2
        exit 1
    fi
}

# 计算期望的字节数
expected_bytes=$(convert_to_bytes "$SIZE")

# 创建文件函数
create_files() {
    local content_type=$1
    local size=$2
    local prefix=$3
    local custom_string=$4
    
    for i in $(seq 1 $FILE_COUNT); do
        filename="${prefix}_${i}.dat"
        echo "创建文件 $i/$FILE_COUNT: $filename"
        
        start_time=$(date +%s)
        
        case $content_type in
            "zero")
                # 使用零填充
                dd if=/dev/zero of="$filename" bs="$size" count=1 status=progress 2>/dev/null
                ;;
            "random")
                # 使用随机数据填充
                dd if=/dev/urandom of="$filename" bs="$size" count=1 status=progress 2>/dev/null
                ;;
            "text")
                # 使用重复文本填充（高效方法）
                yes "$custom_string" | head -c "$size" > "$filename" 2>/dev/null
                ;;
            "char")
                # 使用单个字符填充（高效方法）
                yes "$custom_string" | head -c "$size" > "$filename" 2>/dev/null
                ;;
            *)
                echo "错误: 不支持的内容类型: $content_type"
                echo "支持的类型: zero, random, text, char"
                exit 1
                ;;
        esac
        
        end_time=$(date +%s)
        duration=$((end_time - start_time))
        
        # 验证文件大小
        if [ -f "$filename" ]; then
            actual_size=$(du -b "$filename" | cut -f1)
            if [ $actual_size -eq $expected_bytes ]; then
                echo "✓ 完成: $filename (大小: ${actual_size} 字节, 耗时: ${duration}秒)"
            else
                echo "⚠ 警告: $filename 大小不完全匹配 (期望: $expected_bytes, 实际: $actual_size, 耗时: ${duration}秒)"
            fi
        else
            echo "✗ 错误: 文件创建失败: $filename"
        fi
    done
}

# 执行创建
echo "=========================================="
create_files "$CONTENT_TYPE" "$SIZE" "$FILE_PREFIX" "$CUSTOM_STRING"
echo "=========================================="
echo "文件创建完成!"
echo "文件列表:"
ls -lh "${FILE_PREFIX}"_*.dat 2>/dev/null || echo "未找到匹配文件"
